package com.github.yeecode.mybatisdemo;

import javassist.*;
import javassist.CtClass;
import javassist.ClassPool;
import javassist.CtField;
import javassist.CtMethod;
import java.lang.reflect.Method;


public class DemoApplication {
    public static void main(String[] args) throws Exception {
        ClassPool classPool = ClassPool.getDefault();

        // 定义一个类
        CtClass ctClass = classPool.makeClass("com.github.yeecode.mybatisdemo.model.User");



        CtField nameField = new CtField(classPool.get("java.lang.String"), "name", ctClass); //创建name属性

        ctClass.addField(nameField); //添加字段到类中

        CtMethod setMethod = CtNewMethod.make("public void setName(String name) { this.name = name;}", ctClass); // 创建name的setter

        ctClass.addMethod(setMethod); //添加 方法到 类中

        CtMethod sayHello = CtNewMethod.make("public String sayHello() { return \"Hello, I am \" + this.name ;}", ctClass); // 创建sayHello方法
        ctClass.addMethod(sayHello);

        Class<?> userClazz = ctClass.toClass();

        /*--------------------------剩下都是Javase 中 反射的事情 -----------------------------*/

        // 创建一个对象
        Object user = userClazz.newInstance();
        // 为对象设置name值
        Method[] methods = userClazz.getMethods();
        for (Method method: methods){
            if (method.getName().equals("setName")) {
                method.invoke(user,"易哥");
            }
        }
        // 调用对象sayHello方法
        for (Method method: methods){
            if (method.getName().equals("sayHello")) {
                String result = (String) method.invoke(user);
                System.out.println(result);

            }
        }

        ctClass.writeFile("com.github.yeecode.mybatisdemo.model");
    }
}
